#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

// 这个文件没有测试出FD_CLOEXEC结果
// FD_CLOEXEC可以设置一个文件描述符在执行exec*系列函数的时候自动关闭 也就是golang的exec包所做的
int main(int argc, char const *argv[])
{
    char *arg[]={"env", NULL};
    char *envp[]={"PATH=/tmp", "USER=HHHH", NULL};
    umask(0);
    int fd1 = open("./a.txt", O_CREAT|O_RDWR, 0666);
    
    int fd2 = open("./b.txt", O_CREAT|O_RDWR|O_TRUNC, 0666);
    perror("wenjian");
    
    printf("fd: %d, %d\n", fd1, fd2);
    printf("主进程id:%d\n", getpid());

    if (fork() == 0) { // 子进程
        
        int val = fcntl(fd2,F_GETFD);
        val |= FD_CLOEXEC;
        fcntl(fd2, F_SETFD, val);
        printf("子进程id:%d\n", getpid());
        int len = write(fd2, "iamsubprocesswrite", 18);
        printf("len: %d\n", len);
        fflush(NULL);
        // sleep(100);
        if (execve("/usr/bin/env", arg, envp) < 0) {
            printf("execve执行失败\n");
        }
    }
    sleep(3);
    return 0;
}
